package com.qf.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * 以梦为马，以汗为泉，不忘初心，不负韶华
 *
 * @author
 * @version 1.0
 * @data 2025/2/7 19:26
 */


@Component
@Aspect//声明该类为切面类
public class MyAspect {
   //前置通知，参数是字符串，是目标方法的路径
   // @Before("execution(* com.qf.service.impl.UserServiceImal.findUser())")
    //@Before("execution(* com.qf.service.impl.*.*(..))")

    /**
     *
     * 注解内写的目标方法的路径模板
     *  execution 固定关键词
     *  * 返回值任意
     *  com.qf.service.impl 包路径
     *  .* 该包下所有文件
     *  .* 该类下所有方法
     *  (..) 该方法所有参数
     *-------------------------
     * */
    public void mybefore(){
        System.out.println("我是前置增强的功能");
    }
    //@After("execution(* com.qf.service.*.delUser(..))")
    public void myAfter(){
        System.out.println("我是后置的功能");
    }
    @Around("execution(* com.qf.service.*.delUser(..))")
    public void myAround(ProceedingJoinPoint joinPoint){
        //ProceedingJoinPoint  参数代表目标方法对象
        System.out.println("环绕通知前：开启事务");
        //目标执行
        try {
            joinPoint.proceed();
        } catch (Throwable e) {
            System.out.println("环绕通知后：回滚事务");
            throw new RuntimeException(e);
        }
        System.out.println("环绕通知后：提交事务");
    }
}
